package com.kx.talk.mapper;

import com.kx.talk.pojo.Message;
import com.kx.talk.vo.UnReadCountVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @Author Sun
 * @Date 2021/8/2 22:12
 */
public interface MessageDao {
    /**
     * 这是一个保存消息实体的方法，在这个方法中
     * 消息实体将会保存在已经水平拆分的子表中
     *
     * @param message 消息实体
     * @param index1  子表的第一个索引，它应该是send_user_id%2
     * @param index2  子表的第二个索引，它应该是receive_user_id%2
     * @return 数据库的执行结果
     */
    int insertMessage(@Param("message") Message message,
                      @Param("index1") long index1,
                      @Param("index2") long index2);

    /**
     * 设置消息的读取状态
     *
     * @param index1    发送人id
     * @param index2    接收人id
     * @param messageId 消息id
     * @param readState 消息是否读取 0 未读   1 已读
     * @return 数据库的执行结果
     */
    int updateMessageReadState(@Param("index1") Long index1,
                               @Param("index2") Long index2,
                               @Param("messageId") Long messageId,
                               @Param("readState") Integer readState);

    /**
     * 分页查询聊天记录
     *
     * @param index1          发送人id
     * @param index2          接收人id
     * @param selfLastItemId  自己的上一页最后一条数据的id
     * @param otherLastItemId 对方的的上一页最后一条数据的id
     * @return
     */

    /**
     * 在水平拆表后，分页查询数据的方法
     * 查询第一页数据
     */
    List<Message> selectFirstPageChartRecord(@Param("selfUserId") Long selfUserId,
                                             @Param("otherUserId") Long otherUserId,
                                             @Param("pageSize") Integer pageSize,
                                             @Param("table1_index1") Integer table1_index1,
                                             @Param("table1_index2") Integer table1_index2,
                                             @Param("table2_index1") Integer table2_index1,
                                             @Param("table2_index2") Integer table2_index2);

    /**
     * 在水平拆表后，分页查询数据的方法
     * 自己发送的数据查询第一页
     */
    List<Message> selectSelfFirstPageChartRecord(@Param("selfUserId") Long selfUserId,
                                                 @Param("otherUserId") Long otherUserId,
                                                 @Param("pageSize") Integer pageSize,
                                                 @Param("selfSendLastItemId") Long selfSendLastItemId,
                                                 @Param("table1_index1") Integer table1_index1,
                                                 @Param("table1_index2") Integer table1_index2,
                                                 @Param("table2_index1") Integer table2_index1,
                                                 @Param("table2_index2") Integer table2_index2);

    /**
     * 在水平拆表后，分页查询数据的方法
     * 对方发送的数据查询第一页
     */
    List<Message> selectOtherFirstPageChartRecord(@Param("selfUserId") Long selfUserId,
                                                  @Param("otherUserId") Long otherUserId,
                                                  @Param("pageSize") Integer pageSize,
                                                  @Param("otherSendLastItemId") Long otherSendLastItemId,
                                                  @Param("table1_index1") Integer table1_index1,
                                                  @Param("table1_index2") Integer table1_index2,
                                                  @Param("table2_index1") Integer table2_index1,
                                                  @Param("table2_index2") Integer table2_index2);

    /**
     * 在水平拆表后，分页查询数据的方法
     * 查询数据页码大于第一页
     */
    List<Message> selectPageChartRecord( @Param("selfUserId") Long selfUserId,
                                         @Param("otherUserId") Long otherUserId,
                                         @Param("pageSize") Integer pageSize,
                                         @Param("selfSendLastItemId") Long selfSendLastItemId,
                                         @Param("otherSendLastItemId") Long otherSendLastItemId,
                                         @Param("table1_index1") Integer table1_index1,
                                         @Param("table1_index2") Integer table1_index2,
                                         @Param("table2_index1") Integer table2_index1,
                                         @Param("table2_index2") Integer table2_index2);

    /**
     * 查询指定用户的所有未读消息总数
     * @param userId 用户的id
     * @param index2 表的后位索引序号
     * @param tableCounts 一个占位集合，数量为TABLE_COUNT
     * @return 返回未读消息的总数
     */
    long selectUnreadCountByUserId(Long userId, int index2, List<Void> tableCounts);

    /**
     * 按照好友的id进行分组的查询未读消息总数的方法
     * @param userId 用户id
     * @param index2 表的后位索引序号
     * @param tableCounts 一个占位集合，数量为TABLE_COUNT
     * @return 分组统计数量的结果
     */
    List<UnReadCountVO> selectUnreadCountGroupBy(Long userId, int index2, List<Void> tableCounts);
}
